<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<!-- Mirrored from www.wolfssl.com/wolfSSL/Docs-wolfssl-manual-4-features.html by HTTrack Website Copier/3.x [XR&CO'2014], Tue, 17 Jan 2017 13:29:25 GMT -->
<!-- Added by HTTrack --><meta http-equiv="content-type" content="text/html;charset=UTF-8" /><!-- /Added by HTTrack -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta name="Generator" content="iWeb 3.0.4"/>
<meta name="iWeb-Build" content="local-build-20170103"/>
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7"/>
<meta name="viewport" content="width=770"/>
<title>wolfSSL - Docs | wolfSSL Manual - Chapter 4 (Features)</title>
<link rel="stylesheet" type="text/css" media="screen,print" href="Docs-wolfssl-manual-4-features_files/Docs-wolfssl-manual-4-features.css"/>
<!--[if lt IE 8]><link rel='stylesheet' type='text/css' media='screen,print' href='Docs-wolfssl-manual-4-features_files/Docs-wolfssl-manual-4-featuresIE.css'/><![endif]-->
<!--[if gte IE 8]><link rel='stylesheet' type='text/css' media='screen,print' href='Media/IE8.css'/><![endif]-->
<link rel="stylesheet" href="Scripts/Widgets/HTMLRegion/Paste.css" type="text/css"/>
<script type="text/javascript" src="Scripts/iWebSite.js"></script>
<script type="text/javascript" src="Scripts/iWebImage.js"></script>
<script type="text/javascript" src="Scripts/iWebMediaGrid.js"></script>
<script type="text/javascript" src="Scripts/Widgets/SharedResources/WidgetCommon.js"></script>
<script type="text/javascript" src="Scripts/Widgets/HTMLRegion/Paste.js"></script>
<script type="text/javascript" src="Docs-wolfssl-manual-4-features_files/Docs-wolfssl-manual-4-features.js"></script>
<meta name="description" content="Features of the wolfSSL embedded SSL library including Stream Ciphers, AES-NI, IPv6 support, and SSL Inspection support."/><meta name="keywords" content="embedded ssl, ssl library, embedded web server, openssl alternative, openssl replacement, cyassl, stream ciphers ssl, aes-ni ssl, dtls, mysql ssl, portable ssl, small openssl, smart grid, connected home, ecc, lightweight ssl, suite b, encryption security software, ssl inspection"/><meta name="robots" content="follow,index"/> <script>(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','../../www.google-analytics.com/analytics.js','ga');ga('create','UA-64826966-1','auto');ga('send','pageview');</script>
 
<script>//<![CDATA[
window.zEmbed||function(e,t){var n,o,d,i,s,a=[],r=document.createElement("iframe");window.zEmbed=function(){a.push(arguments)},window.zE=window.zE||window.zEmbed,r.src="javascript:false",r.title="",r.role="presentation",(r.frameElement||r).style.cssText="display: none",d=document.getElementsByTagName("script"),d=d[d.length-1],d.parentNode.insertBefore(r,d),i=r.contentWindow,s=i.document;try{o=s}catch(c){n=document.domain,r.src='javascript:var d=document.open();d.domain="'+n+'";void(0);',o=s}o.open()._l=function(){var o=this.createElement("script");n&&(this.domain=n),o.id="js-iframe-async",o.src=e,this.t=+new Date,this.zendeskHost=t,this.zEQueue=a,this.body.appendChild(o)},o.write('<body onload="document._l();">'),o.close()}("../../assets.zendesk.com/embeddable_framework/main.js","wolfssl.zendesk.com");
//]]></script>
  </head>
<body style="background: rgb(255, 255, 255); margin: 0pt; " onload="onPageLoad();" onunload="onPageUnload();">
<div style="text-align: center; ">
<div style="margin-bottom: 20px; margin-left: auto; margin-right: auto; margin-top: 20px; overflow: hidden; position: relative; word-wrap: break-word;  background: rgb(255, 255, 255); text-align: left; width: 770px; " id="body_content">
<div style="float: left; margin-left: 0px; position: relative; width: 770px; z-index: 0; " id="nav_layer">
<div style="height: 0px; line-height: 0px; " class="bumper"> </div>
<div style="clear: both; height: 0px; line-height: 0px; " class="spacer"> </div>
</div>
<div style="float: left; height: 0px; line-height: 0px; margin-left: 0px; position: relative; width: 770px; z-index: 10; " id="header_layer">
<div style="height: 0px; line-height: 0px; " class="bumper"> </div>
</div>
<div style="margin-left: 0px; position: relative; width: 770px; z-index: 5; " id="body_layer">
<div style="height: 0px; line-height: 0px; " class="bumper"> </div>
<div id="id1" style="height: 622px; left: 35px; position: absolute; top: 3972px; width: 700px; z-index: 1; " class="style_SkipStroke shape-with-text">
<div class="text-content graphic_textbox_layout_style_default_External_700_622" style="padding: 0px; ">
<div class="graphic_textbox_layout_style_default">
<p style="padding-top: 0pt; " class="paragraph_style">(Table 3: Bit Strength Descriptions)<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">Using this table as a guide, to begin to classify a cipher suite, we categorize it based on the strength of the symmetric encryption algorithm.  In doing this, a rough grade classification can be devised to classify each cipher suite based on bits of security (only taking into account symmetric key size):<br/></p>
<p class="paragraph_style_1"> <br/></p>
<p class="paragraph_style_1"><span class="style">LOW</span>             = bits of security smaller than 128 bits<br/></p>
<p class="paragraph_style_1"><span class="style">MEDIUM</span>       = bits of security equal to 128 bits<br/></p>
<p class="paragraph_style_1"><span class="style">HIGH</span>             = bits of security larger than 128 bits<br/></p>
<p class="paragraph_style_1"> <br/></p>
<p class="paragraph_style_1">Outside of the symmetric encryption algorithm strength, the strength of a cipher suite will depend greatly on the key sizes of the key exchange and authentication algorithm keys.  The strength is only as good as the cipher suite’s weakest link.<br/></p>
<p class="paragraph_style_1"> <br/></p>
<p class="paragraph_style_1">Following the above grading methodology (and only basing it on symmetric encryption algorithm strength), CyaSSL 2.0.0 currently supports a total of 0 LOW strength cipher suites, 12 MEDIUM strength cipher suites, and 8 HIGH strength cipher suites – as listed below.  The following strength classification could change depending on the chosen key sizes of the other algorithms involved. For a reference on hash function security strength, see Table 3 (pg. 64) of NIST SP800-57.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">In some cases, you will see ciphers referenced as “<span class="style">EXPORT</span>” ciphers.  These ciphers originated from the time period in US history (as late as 1992) when it was illegal to export software with strong encryption from the United States.  Strong encryption was classified as “Munitions” by the US Government (under the same category as Nuclear Weapons, Tanks, and Ballistic Missiles). Because of this restriction, software being exported included “weakened” ciphers (mostly in smaller key sizes).  In the current day, this restriction has been lifted, and as such, EXPORT ciphers are no longer a mandated necessity.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_2">4.3.2 Supported Cipher Suites<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">The following cipher suites are supported by wolfSSL. A cipher suite is a combination of authentication, encryption, and message authentication code (MAC) algorithms which are used during the TLS or SSL handshake to negotiate security settings for a connection.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">Each cipher suite defines a key exchange algorithm, a bulk encryption algorithm, and a message authentication code algorithm (MAC). The <span class="style">key exchange algorithm</span> (RSA, DSS, DH, EDH) determines how the client and server will authenticate during the handshake process. The <span class="style">bulk encryption algorithm</span> (DES, 3DES, AES, ARC4, RABBIT, HC-128), including block ciphers and stream ciphers, is used to encrypt the message stream. The <span class="style">message authentication code (MAC) algorithm</span> (MD2, MD5, SHA-1, SHA-256, SHA-512, RIPEMD) is a hash function used to create the message digest.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p style="padding-bottom: 0pt; " class="paragraph_style_1">The table below matches up to the cipher suites (and categories) found in &lt;wolfssl_root&gt;/wolfssl/internal.h.  If you are looking for a cipher suite which is not in the following list, please contact us to discuss getting it added to wolfSSL.</p>
</div>
</div>
</div>
<div id="id2" style="height: 38px; left: 375px; position: absolute; top: 157px; width: 361px; z-index: 1; " class="style_SkipStroke shape-with-text">
<div class="text-content graphic_textbox_layout_style_default_External_361_38" style="padding: 0px; ">
<div class="graphic_textbox_layout_style_default">
<p style="padding-bottom: 0pt; padding-top: 0pt; " class="paragraph_style_3">wolfSSL Manual</p>
</div>
</div>
</div>
<div id="id3" style="height: 3302px; left: 35px; position: absolute; top: 281px; width: 701px; z-index: 1; " class="style_SkipStroke shape-with-text">
<div class="text-content graphic_textbox_layout_style_default_External_701_3302" style="padding: 0px; ">
<div class="graphic_textbox_layout_style_default">
<p style="padding-top: 0pt; " class="paragraph_style_4">Chapter 4: Features<span class="style_1"><br/></span></p>
<p class="paragraph_style_5"><br/></p>
<p class="paragraph_style_1">wolfSSL supports the C programming language as a primary interface, but also supports several other host languages, including Java, PHP, Perl, and Python (through a <a title="http://swig.org/" href="http://swig.org/">SWIG</a> interface). If you have interest in hosting wolfSSL in another programming language that is not currently supported, please contact us. <br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">This chapter covers some of the features of wolfSSL in more depth, including Stream Ciphers, AES-NI, IPv6 support, SSL Inspection (Sniffer) support, and more.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_6">4.1 Features Overview <br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">For an overview of wolfSSL features, please reference the wolfSSL product webpage:<br/></p>
<p class="paragraph_style_1"><a title="https://wolfssl.com/wolfSSL/Products-wolfssl.html" href="Products-wolfssl.html">https://wolfssl.com/wolfSSL/Products-wolfssl.html</a><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_6">4.2 Protocol Support<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">wolfSSL supports <span class="style">SSL 3.0</span>, <span class="style">TLS</span> (<span class="style">1.0</span>, <span class="style">1.1</span>, <span class="style">1.2</span>, <span class="style">1.3 </span>(client side)), and <span class="style">DTLS </span>(<span class="style">1.0</span> and <span class="style">1.2</span>). You can easily select a protocol to use by using one of the following functions (as shown for either the client or server).  CyaSSL does not support SSL 2.0, as it has been insecure for several years.  The client and server functions below change slightly when using the OpenSSL compatibility layer.  For the OpenSSL-compatible functions, please see <a title="Docs-wolfssl-manual-13-openssl-compatibility.html" href="Docs-wolfssl-manual-13-openssl-compatibility.html">Chapter 13</a>.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_2">4.2.1 Server Functions<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_7">wolfDTLSv1_server_method(void);     // DTLS 1.0<br/></p>
<p class="paragraph_style_7">wolfSSLv3_server_method(void);      // SSL 3.0<br/></p>
<p class="paragraph_style_7">wolfTLSv1_server_method(void);      // TLS 1.0<br/></p>
<p class="paragraph_style_7">wolfTLSv1_1_server_method(void);    // TLS 1.1<br/></p>
<p class="paragraph_style_7">wolfTLSv1_2_server_method(void);    // TLS 1.2<br/></p>
<p class="paragraph_style_7">wolfSSLv23_server_method(void);     // Use highest possible version from<br/></p>
<p class="paragraph_style_7">                                       SSLv3 - TLS 1.2<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">wolfSSL supports robust server downgrade with the <span class="style">wolfSSLv23_server_method</span>() function. See section 4.2.3 for a details.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_2">4.2.2 Client Functions<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_7">wolfDTLSv1_client_method(void);     // DTLS 1.0<br/></p>
<p class="paragraph_style_7">wolfSSLv3_client_method(void);      // SSL 3.0<br/></p>
<p class="paragraph_style_7">wolfTLSv1_client_method(void);      // TLS 1.0<br/></p>
<p class="paragraph_style_7">wolfTLSv1_1_client_method(void);    // TLS 1.1<br/></p>
<p class="paragraph_style_7">wolfTLSv1_2_client_method(void);    // TLS 1.2<br/></p>
<p class="paragraph_style_7">wolfSSLv23_client_method(void);     // Use highest possible version from<br/></p>
<p class="paragraph_style_7">                                       SSLv3 - TLS 1.2<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">wolfSSL supports robust client downgrade with the <span class="style">wolfSSLv23_client_method</span>() function. See section 4.2.3 for a details.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">For details on how to use these functions, please see the <a title="Docs-wolfssl-manual-3-getting-started.html" href="Docs-wolfssl-manual-3-getting-started.html">Chapter 3</a>, “Getting Started”. For a comparison between SSL 3.0, TLS 1.0, 1.1, 1.2, and DTLS, please see <a title="Docs-wolfssl-manual-A-ssl-tls-overview.html" href="Docs-wolfssl-manual-A-ssl-tls-overview.html">Appendix A</a>.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_2"><br/></p>
<p class="paragraph_style_2">4.2.3 Robust Client and Server Downgrade<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">Both wolfSSL clients and servers have robust version downgrade capability.  If a specific protocol version method is used on either side, then only that version will be negotiated or an error will be returned.  For example, a client that uses TLS 1.0 and tries to connect to a SSL 3.0 only server will fail, likewise connecting to a TLS 1.1 will fail as well.  <br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">To resolve this issue, a client that uses the <span class="style">wolfSSLv23_client_method</span>() function will use the highest protocol version supported by the server and downgrade to TLS 1.0 if needed. In this case, the client will be able to connect to a server running TLS 1.0 - TLS 1.2.  The only versions it can't connect to is SSL 2.0 which has been insecure for years, and SSL 3.0 which has been disabled by default. <br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">Similarly, a server using the <span class="style">wolfSSLv23_server_method</span>() function can handle clients supporting protocol versions from TLS 1.0 - TLS 1.2.  A wolfSSL server can't accept a connection from SSLv2 because no security is provided.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_2">4.2.4 IPv6 Support<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">If you are an adopter of IPv6 and want to use an embedded SSL implementation then you may have been wondering if wolfSSL supports IPv6.  The answer is yes, we do support wolfSSL running on top of IPv6.  <br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">wolfSSL was designed as IP neutral, and will work with both IPv4 and IPv6, but the current test applications default to IPv4 (so as to apply to a broader range of systems).  To change the test applications to IPv6, use the --enable-ipv6 option while building wolfSSL.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">Further information on IPv6 can be found here:<br/></p>
<p class="paragraph_style_1"><a title="http://en.wikipedia.org/wiki/IPv6" href="http://en.wikipedia.org/wiki/IPv6">http://en.wikipedia.org/wiki/IPv6</a>.<br/></p>
<p class="paragraph_style_2"><br/></p>
<p class="paragraph_style_2"><br/></p>
<p class="paragraph_style_2">4.2.5 DTLS<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">wolfSSL has support for <span class="style">DTLS</span> (“Datagram” TLS) for both client and server.  The current supported version is DTLS 1.0.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">The TLS protocol was designed to provide a secure transport channel across a reliable medium (such as TCP).  As application layer protocols began to be developed using UDP transport (such as SIP and various electronic gaming protocols), a need arose for a way to provide communications security for applications which are delay sensitive. This need lead to the creation of the DTLS protocol.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">Many people believe the difference between TLS and DTLS is the same as TLS vs. UDP. This is incorrect.  UDP has the benefit of having no handshake, no tear-down, and no delay in the middle if something gets lost (compared with TCP).  DTLS on the other hand, has an extended SSL handshake and tear-down and must implement TCP-like behavior for the handshake.  In essence, DTLS reverses the benefits that are offered by UDP in exchange for a secure connection.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">DTLS can be enabled when building CyaSSL by using the <span class="style">--enable-dtls</span> build option.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_2">4.2.6 LwIP (Lightweight Internet Protocol)<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">wolfSSL supports the lightweight internet protocol implementation out of the box. To use  this protocol all you need to do is define <span class="style">WOLFSSL_LWIP</span> or navigate to the <span class="style">settings.h</span> file and uncomment the line:<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_7">/*#define WOLFSSL_LWIP*/<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">The focus of lwIP is to reduce RAM usage while still providing a full TCP stack. That focus makes lwIP great for use in embedded systems, the same area where wolfSSL is an ideal match for SSL/TLS needs.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_2">4.2.7 A Comparison of TLS 1.1 and TLS 1.2<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">As stated in the TLS 1.1 and 1.2 protocol definitions (RFC 4346, RFC 5246), “The primary goal of the TLS protocol is to provide privacy and data integrity between two communicating applications.”  TLS 1.2 is an improvement to the TLS 1.2 standard, but how exactly do they differ?  What was changed in TLS 1.2 to warrant a new version of the protocol?<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">Listed below are the changes made to both version 1.1 and 1.2 of the TLS protocol.  TLS 1.2 support is slowly making it’s way into existing projects.  CyaSSL fully supports SSL 3.0, TLS 1.0, TLS 1.1, and TLS 1.2.<br/></p>
<p class="paragraph_style_1"><br/></p>
<ol>
<li style="line-height: 15px; padding-left: 15px; text-indent: -15px; " class="full-width" value="1">
<p style="text-indent: -15px; " class="paragraph_style_8"><span style="font-size: 12px; " class="Bullet">A.</span><span style="width: 3px; " class="inline-block"></span> TLS 1.1<br/></p>
</li>
</ol>
<p class="paragraph_style_9"><br/></p>
<p class="paragraph_style_1">This protocol was defined in RFC 4346 in April of 2006, and is an update to TLS 1.0.  The major changes are:<br/></p>
<p class="paragraph_style_1"><br/></p>
<ol>
<li style="line-height: 15px; padding-left: 20px; text-indent: -10px; " class="full-width">
<p style="text-indent: -10px; " class="paragraph_style_10"><span style="font-size: 12px; " class="Bullet">-</span><span style="width: 6px; " class="inline-block"></span>The Implicit Initialization Vector (IV) is replaced with an explicit IV to protect against Cipher block chaining (CBC) attacks.<br/></p>
</li>
<li style="line-height: 15px; padding-left: 20px; text-indent: -10px; " class="full-width">
<p style="text-indent: -10px; " class="paragraph_style_10"><span style="font-size: 12px; " class="Bullet">-</span><span style="width: 6px; " class="inline-block"></span>Handling of padded errors is changed to use the bad_record_mac alert rather than the decryption_failed alert to protect against CBC attacks.<br/></p>
</li>
<li style="line-height: 15px; padding-left: 20px; text-indent: -10px; " class="full-width">
<p style="text-indent: -10px; " class="paragraph_style_10"><span style="font-size: 12px; " class="Bullet">-</span><span style="width: 6px; " class="inline-block"></span>IANA registries are defined for protocol parameters<br/></p>
</li>
<li style="line-height: 15px; padding-left: 20px; text-indent: -10px; " class="full-width">
<p style="text-indent: -10px; " class="paragraph_style_10"><span style="font-size: 12px; " class="Bullet">-</span><span style="width: 6px; " class="inline-block"></span>Premature closes no longer cause a session to be non-resumable.<br/></p>
</li>
</ol>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">RFC 4346:  <a title="http://tools.ietf.org/html/rfc4346#section-1.1" href="http://tools.ietf.org/html/rfc4346#section-1.1">http://tools.ietf.org/html/rfc4346#section-1.1</a><br/></p>
<p class="paragraph_style_1"><br/></p>
<ol>
<li style="line-height: 15px; padding-left: 15px; text-indent: -15px; " class="full-width" value="2">
<p style="text-indent: -15px; " class="paragraph_style_11"><span style="font-size: 12px; " class="Bullet">B.</span><span style="width: 3px; " class="inline-block"></span> TLS 1.2<br/></p>
</li>
</ol>
<p class="paragraph_style_12"><br/></p>
<p class="paragraph_style_1">This protocol was defined in RFC 5246 in August of 2008.  Based on TLS 1.1, TLS 1.2 contains improved flexibility. One of the primary goals of the TLS 1.2 revision was to remove the protocol’s dependency on the MD5 and SHA-1 digest algorithms.  The major differences include:<br/></p>
<p class="paragraph_style_1"><br/></p>
<ol>
<li style="line-height: 15px; padding-left: 20px; text-indent: -10px; " class="full-width">
<p style="text-indent: -10px; " class="paragraph_style_10"><span style="font-size: 12px; " class="Bullet">-</span><span style="width: 6px; " class="inline-block"></span>The MD5/SHA-1 combination in the pseudorandom function (PRF) was replaced with cipher-suite-specified PRFs.<br/></p>
</li>
<li style="line-height: 15px; padding-left: 20px; text-indent: -10px; " class="full-width">
<p style="text-indent: -10px; " class="paragraph_style_10"><span style="font-size: 12px; " class="Bullet">-</span><span style="width: 6px; " class="inline-block"></span>The MD5/SHA-1 combination in the digitally-signed element was replaced with a single hash.  Signed elements include a field explicitly specifying the hash algorithm used.<br/></p>
</li>
<li style="line-height: 15px; padding-left: 20px; text-indent: -10px; " class="full-width">
<p style="text-indent: -10px; " class="paragraph_style_10"><span style="font-size: 12px; " class="Bullet">-</span><span style="width: 6px; " class="inline-block"></span>There was substantial cleanup to the client's and server's ability to specify which hash and signature algorithms they will accept.<br/></p>
</li>
<li style="line-height: 15px; padding-left: 20px; text-indent: -10px; " class="full-width">
<p style="text-indent: -10px; " class="paragraph_style_10"><span style="font-size: 12px; " class="Bullet">-</span><span style="width: 6px; " class="inline-block"></span>Addition of support for authenticated encryption with additional data modes.<br/></p>
</li>
<li style="line-height: 15px; padding-left: 20px; text-indent: -10px; " class="full-width">
<p style="text-indent: -10px; " class="paragraph_style_10"><span style="font-size: 12px; " class="Bullet">-</span><span style="width: 6px; " class="inline-block"></span>TLS Extensions definition and AES Cipher Suites were merged in.<br/></p>
</li>
<li style="line-height: 15px; padding-left: 20px; text-indent: -10px; " class="full-width">
<p style="text-indent: -10px; " class="paragraph_style_10"><span style="font-size: 12px; " class="Bullet">-</span><span style="width: 6px; " class="inline-block"></span>Tighter checking of EncryptedPreMasterSecret version numbers.<br/></p>
</li>
<li style="line-height: 15px; padding-left: 20px; text-indent: -10px; " class="full-width">
<p style="text-indent: -10px; " class="paragraph_style_10"><span style="font-size: 12px; " class="Bullet">-</span><span style="width: 6px; " class="inline-block"></span>Many of the requirements were tightened<br/></p>
</li>
<li style="line-height: 15px; padding-left: 20px; text-indent: -10px; " class="full-width">
<p style="text-indent: -10px; " class="paragraph_style_10"><span style="font-size: 12px; " class="Bullet">-</span><span style="width: 6px; " class="inline-block"></span>Verify_data length depends on the cipher suite<br/></p>
</li>
<li style="line-height: 15px; padding-left: 20px; text-indent: -10px; " class="full-width">
<p style="text-indent: -10px; " class="paragraph_style_10"><span style="font-size: 12px; " class="Bullet">-</span><span style="width: 6px; " class="inline-block"></span>Description of Bleichenbacher/Dlima attack defenses cleaned up.<br/></p>
</li>
<li style="line-height: 15px; padding-left: 20px; text-indent: -10px; " class="full-width">
<p style="text-indent: -10px; " class="paragraph_style_10"><span style="font-size: 12px; " class="Bullet">-</span><span style="width: 6px; " class="inline-block"></span>Alerts must be sent in many cases<br/></p>
</li>
<li style="line-height: 15px; padding-left: 20px; text-indent: -10px; " class="full-width">
<p style="text-indent: -10px; " class="paragraph_style_10"><span style="font-size: 12px; " class="Bullet">-</span><span style="width: 6px; " class="inline-block"></span>After a certificate_request, if no certificates are available, clients now MUST send an empty certificate list.<br/></p>
</li>
<li style="line-height: 15px; padding-left: 20px; text-indent: -10px; " class="full-width">
<p style="text-indent: -10px; " class="paragraph_style_10"><span style="font-size: 12px; " class="Bullet">-</span><span style="width: 6px; " class="inline-block"></span>TLS_RSA_WITH_AES_128_CBC_SHA is now the mandatory to implement cipher suite.<br/></p>
</li>
<li style="line-height: 15px; padding-left: 20px; text-indent: -10px; " class="full-width">
<p style="text-indent: -10px; " class="paragraph_style_10"><span style="font-size: 12px; " class="Bullet">-</span><span style="width: 6px; " class="inline-block"></span>Added HMAC-SHA256 cipher suites.<br/></p>
</li>
<li style="line-height: 15px; padding-left: 20px; text-indent: -10px; " class="full-width">
<p style="text-indent: -10px; " class="paragraph_style_10"><span style="font-size: 12px; " class="Bullet">-</span><span style="width: 6px; " class="inline-block"></span>Removed IDEA and DES cipher suites.  They are now deprecated.<br/></p>
</li>
</ol>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">RFC 5246:  <a title="http://tools.ietf.org/html/rfc5246" href="http://tools.ietf.org/html/rfc5246">http://tools.ietf.org/html/rfc5246</a><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_9">C.  Goals of the TLS Protocol<br/></p>
<p class="paragraph_style_1"><br/></p>
<ol>
<li style="line-height: 15px; padding-left: 20px; text-indent: -10px; " class="full-width">
<p style="text-indent: -10px; " class="paragraph_style_10"><span style="font-size: 12px; " class="Bullet">-</span><span style="width: 6px; " class="inline-block"></span>Cryptographic security: TLS should be used to establish a secure connection between two parties.<br/></p>
</li>
<li style="line-height: 15px; padding-left: 20px; text-indent: -10px; " class="full-width">
<p style="text-indent: -10px; " class="paragraph_style_10"><span style="font-size: 12px; " class="Bullet">-</span><span style="width: 6px; " class="inline-block"></span>Interoperability: Independent programmers should be able to develop applications utilizing TLS that can successfully exchange cryptographic parameters without knowledge of one another's code.<br/></p>
</li>
<li style="line-height: 15px; padding-left: 20px; text-indent: -10px; " class="full-width">
<p style="text-indent: -10px; " class="paragraph_style_10"><span style="font-size: 12px; " class="Bullet">-</span><span style="width: 6px; " class="inline-block"></span>Extensibility: TLS seeks to provide a framework into which new public key and bulk encryption methods can be incorporated as necessary.  This will also accomplish two sub-goals: preventing the need to create a new protocol (and risking the introduction of possible new weaknesses) and avoiding the need to implement an entire new security library.<br/></p>
</li>
<li style="line-height: 15px; padding-left: 20px; text-indent: -10px; " class="full-width">
<p style="text-indent: -10px; " class="paragraph_style_10"><span style="font-size: 12px; " class="Bullet">-</span><span style="width: 6px; " class="inline-block"></span>Relative efficiency: Cryptographic operations tend to be highly CPU intensive, particularly public key operations.  For this reason, the TLS protocol has incorporated an optional session caching scheme to reduce the number of connections that need to be established from scratch.  Additionally, care has been taken to reduce network activity.<br/></p>
</li>
</ol>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_9">Resources:<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">If you would like to read more about SSL or TLS, here are several resources that might be helpful:<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">TLS - Wikipedia (<a title="http://en.wikipedia.org/wiki/Transport_Layer_Security" href="http://en.wikipedia.org/wiki/Transport_Layer_Security">http://en.wikipedia.org/wiki/Transport_Layer_Security</a>)<br/></p>
<p class="paragraph_style_1">SSL versus TLS - What's the Difference? (<a title="http://luxsci.com/blog/ssl-versus-tls-whats-the-difference.html" href="http://luxsci.com/blog/ssl-versus-tls-whats-the-difference.html">http://luxsci.com/blog/ssl-versus-tls-whats-the-difference.html</a>)<br/></p>
<p class="paragraph_style_1">Cisco - SSL: Foundation for Web Security (<a title="http://www.cisco.com/web/about/ac123/ac147/archived_issues/ipj_1-1/ssl.html" href="http://www.cisco.com/web/about/ac123/ac147/archived_issues/ipj_1-1/ssl.html">http://www.cisco.com/web/about/ac123/ac147/archived_issues/ipj_1-1/ssl.html</a>)<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_6">4.3 Cipher Support<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_2">4.3.1 Cipher Suite Strength and Choosing Proper Key Sizes<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">To see what ciphers are currently being used you can call the method:<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_7">wolfSSL_get_ciphers()<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">This function will return the currently enabled cipher suites.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">Cipher suites come in a variety of strengths.  Because they are made up of several different types of algorithms (authentication, encryption, and message authentication code (MAC)), the strength of each varies with the chosen key sizes.  There can be many methods of grading the strength of a cipher suite - the specific method used seems to vary between different projects and companies an can include things such as symmetric and public key algorithm key sizes, type of algorithm, performance, and known weaknesses.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><span class="style">NIST</span> (National Institute of Standards and Technology) makes recommendations on choosing an acceptable cipher suite by providing comparable algorithm strengths for varying key sizes of each.  The strength of a cryptographic algorithm depends on the algorithm and the key size used.  The NIST Special Publication, SP800-57, states that two algorithms are considered to be of comparable strength as follows:<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_13">&quot;… two algorithms are considered  to be of comparable strength for the given key sizes (X and Y) if the amount of work needed to “break the algorithms” or determine the keys (with the given key sizes) is approximately the same using a given resource. The security strength of an algorithm for a given key size is traditionally described in terms of the amount of work it takes to try all keys for a symmetric algorithm with a key size of &quot;X&quot; that has no short cut attacks (i.e., the most efficient attack is to try all possible keys).&quot;<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">The following two tables are based off of both Table 2 (pg. 64) and Table 4 (pg. 66) from NIST SP800-57, and shows comparable security strength between algorithms as well as a strength measurement (based off of NIST’s suggested algorithm security lifetimes using bits of security).<br/></p>
<p class="paragraph_style_1"><br/></p>
<p style="padding-bottom: 0pt; " class="paragraph_style_1"><span class="style">Note:</span>  In the following table “<span class="style">L</span>” is the size of the public key for finite field cryptography (FFC), “<span class="style">N</span>” is the size of the private key for FFC, “<span class="style">k</span>” is considered the key size for integer factorization cryptography (IFC), and “<span class="style">f</span>” is considered the key size for elliptic curve cryptography.</p>
</div>
</div>
</div>
<div id="id4" style="height: 24px; left: 193px; position: absolute; top: 122px; width: 268px; z-index: 1; " class="style_SkipStroke shape-with-text">
<div class="text-content graphic_textbox_layout_style_default_External_268_24" style="padding: 0px; ">
<div class="graphic_textbox_layout_style_default">
<p style="padding-bottom: 0pt; padding-top: 0pt; " class="paragraph_style_14"><a class="class1" title="Docs.html" href="Docs.html">Docs</a> <span class="style_2">-&gt;</span> <span class="style_3">wolfSSL Manual</span></p>
</div>
</div>
</div>
<div style="height: 1px; width: 698px;  height: 1px; left: 37px; position: absolute; top: 220px; width: 698px; z-index: 1; " class="tinyText">
<div style="position: relative; width: 698px; ">
<img src="Docs-wolfssl-manual-4-features_files/shapeimage_1.jpg" alt="" style="height: 1px; left: 0px; position: absolute; top: 0px; width: 698px; "/>
</div>
</div>
<div style="height: 37px; width: 545px;  height: 37px; left: 191px; position: absolute; top: 80px; width: 545px; z-index: 1; " class="tinyText">
<div style="position: relative; width: 545px; ">
<img src="Docs-wolfssl-manual-4-features_files/shapeimage_2.png" alt="" style="height: 37px; left: 0px; position: absolute; top: 0px; width: 545px; "/>
</div>
</div>
<div id="id5" style="height: 25px; left: 200px; position: absolute; top: 84px; width: 43px; z-index: 1; " class="style_SkipStroke_1 shape-with-text">
<div class="text-content graphic_textbox_layout_style_default_External_43_25" style="padding: 0px; ">
<div class="graphic_textbox_layout_style_default">
<p style="padding-bottom: 0pt; padding-top: 0pt; " class="paragraph_style_15"><a class="class2" title="Home.html" href="Home.html">Home</a></p>
</div>
</div>
</div>
<div id="id6" style="height: 25px; left: 365px; position: absolute; top: 84px; width: 72px; z-index: 1; " class="style_SkipStroke shape-with-text">
<div class="text-content graphic_textbox_layout_style_default_External_72_25" style="padding: 0px; ">
<div class="graphic_textbox_layout_style_default">
<p style="padding-bottom: 0pt; padding-top: 0pt; " class="paragraph_style_16"><a class="class3" title="https://wolfssl.com/wolfSSL/download/downloadForm.php" href="https://wolfssl.com/wolfSSL/download/downloadForm.php">Download</a></p>
</div>
</div>
</div>
<div id="id7" style="height: 25px; left: 439px; position: absolute; top: 84px; width: 59px; z-index: 1; " class="style_SkipStroke shape-with-text">
<div class="text-content graphic_textbox_layout_style_default_External_59_25" style="padding: 0px; ">
<div class="graphic_textbox_layout_style_default">
<p style="padding-bottom: 0pt; padding-top: 0pt; " class="paragraph_style_16"><a class="class4" title="License.html" href="License.html">License</a></p>
</div>
</div>
</div>
<div id="id8" style="height: 25px; left: 499px; position: absolute; top: 84px; width: 44px; z-index: 1; " class="style_SkipStroke shape-with-text">
<div class="text-content graphic_textbox_layout_style_default_External_44_25" style="padding: 0px; ">
<div class="graphic_textbox_layout_style_default">
<p style="padding-bottom: 0pt; padding-top: 0pt; " class="paragraph_style_16"><a class="class5" title="Blog/Blog.html" href="Blog/Blog.html">Blog</a></p>
</div>
</div>
</div>
<div id="id9" style="height: 25px; left: 589px; position: absolute; top: 84px; width: 80px; z-index: 1; " class="style_SkipStroke shape-with-text">
<div class="text-content graphic_textbox_layout_style_default_External_80_25" style="padding: 0px; ">
<div class="graphic_textbox_layout_style_default">
<p style="padding-bottom: 0pt; padding-top: 0pt; " class="paragraph_style_16"><a class="class6" title="Community.html" href="Community.html">Community</a></p>
</div>
</div>
</div>
<div style="height: 36px; width: 1px;  height: 36px; left: 245px; position: absolute; top: 81px; width: 0px; z-index: 1; " class="tinyText">
<div style="position: relative; width: 0px; ">
<img src="Docs-wolfssl-manual-4-features_files/shapeimage_3.png" alt="" style="height: 36px; left: 0px; position: absolute; top: 0px; width: 1px; "/>
</div>
</div>
<div style="height: 37px; width: 1px;  height: 37px; left: 296px; position: absolute; top: 80px; width: 0px; z-index: 1; " class="tinyText">
<div style="position: relative; width: 0px; ">
<img src="Docs-wolfssl-manual-4-features_files/shapeimage_4.png" alt="" style="height: 37px; left: 0px; position: absolute; top: 0px; width: 1px; "/>
</div>
</div>
<div style="height: 36px; width: 1px;  height: 36px; left: 363px; position: absolute; top: 81px; width: 0px; z-index: 1; " class="tinyText">
<div style="position: relative; width: 0px; ">
<img src="Docs-wolfssl-manual-4-features_files/shapeimage_5.png" alt="" style="height: 36px; left: 0px; position: absolute; top: 0px; width: 1px; "/>
</div>
</div>
<div style="height: 36px; width: 1px;  height: 36px; left: 438px; position: absolute; top: 81px; width: 0px; z-index: 1; " class="tinyText">
<div style="position: relative; width: 0px; ">
<img src="Docs-wolfssl-manual-4-features_files/shapeimage_6.png" alt="" style="height: 36px; left: 0px; position: absolute; top: 0px; width: 1px; "/>
</div>
</div>
<div style="height: 37px; width: 1px;  height: 37px; left: 498px; position: absolute; top: 80px; width: 0px; z-index: 1; " class="tinyText">
<div style="position: relative; width: 0px; ">
<img src="Docs-wolfssl-manual-4-features_files/shapeimage_7.png" alt="" style="height: 37px; left: 0px; position: absolute; top: 0px; width: 1px; "/>
</div>
</div>
<div style="height: 37px; width: 1px;  height: 37px; left: 589px; position: absolute; top: 80px; width: 0px; z-index: 1; " class="tinyText">
<div style="position: relative; width: 0px; ">
<img src="Docs-wolfssl-manual-4-features_files/shapeimage_8.png" alt="" style="height: 37px; left: 0px; position: absolute; top: 0px; width: 1px; "/>
</div>
</div>
<div id="id10" style="height: 25px; left: 671px; position: absolute; top: 84px; width: 61px; z-index: 1; " class="style_SkipStroke shape-with-text">
<div class="text-content graphic_textbox_layout_style_default_External_61_25" style="padding: 0px; ">
<div class="graphic_textbox_layout_style_default">
<p style="padding-bottom: 0pt; padding-top: 0pt; " class="paragraph_style_16"><a class="class7" title="Contact.html" href="Contact.html">Contact</a></p>
</div>
</div>
</div>
<div id="id11" style="height: 25px; left: 249px; position: absolute; top: 84px; width: 44px; z-index: 1; " class="style_SkipStroke shape-with-text">
<div class="text-content graphic_textbox_layout_style_default_External_44_25" style="padding: 0px; ">
<div class="graphic_textbox_layout_style_default">
<p style="padding-bottom: 0pt; padding-top: 0pt; " class="paragraph_style_15"><a class="class8" title="About.html" href="About.html">About</a></p>
</div>
</div>
</div>
<div style="height: 36px; width: 1px;  height: 36px; left: 670px; position: absolute; top: 81px; width: 0px; z-index: 1; " class="tinyText">
<div style="position: relative; width: 0px; ">
<img src="Docs-wolfssl-manual-4-features_files/shapeimage_9.png" alt="" style="height: 36px; left: 0px; position: absolute; top: 0px; width: 1px; "/>
</div>
</div>
<div id="id12" style="height: 25px; left: 298px; position: absolute; top: 84px; width: 63px; z-index: 1; " class="style_SkipStroke_1 shape-with-text">
<div class="text-content graphic_textbox_layout_style_default_External_63_25" style="padding: 0px; ">
<div class="graphic_textbox_layout_style_default">
<p style="padding-bottom: 0pt; padding-top: 0pt; " class="paragraph_style_16"><a class="class9" title="Products.html" href="Products.html">Products</a></p>
</div>
</div>
</div>
<div id="id13" style="height: 25px; left: 549px; position: absolute; top: 84px; width: 41px; z-index: 1; " class="style_SkipStroke shape-with-text">
<div class="text-content graphic_textbox_layout_style_default_External_41_25" style="padding: 0px; ">
<div class="graphic_textbox_layout_style_default">
<p style="padding-bottom: 0pt; padding-top: 0pt; " class="paragraph_style_15"><a class="class10" title="Docs.html" href="Docs.html">Docs</a></p>
</div>
</div>
</div>
<div style="height: 37px; width: 1px;  height: 37px; left: 545px; position: absolute; top: 80px; width: 0px; z-index: 1; " class="tinyText">
<div style="position: relative; width: 0px; ">
<img src="Docs-wolfssl-manual-4-features_files/shapeimage_10.png" alt="" style="height: 37px; left: 0px; position: absolute; top: 0px; width: 1px; "/>
</div>
</div>
<div id="id14" style="height: 25px; left: 35px; position: absolute; top: 224px; width: 125px; z-index: 1; " class="style_SkipStroke shape-with-text">
<div class="text-content graphic_textbox_layout_style_default_External_125_25" style="padding: 0px; ">
<div class="graphic_textbox_layout_style_default">
<p style="padding-bottom: 0pt; padding-top: 0pt; " class="paragraph_style_17"><a class="class11" title="Docs-wolfssl-manual-3-getting-started.html" href="Docs-wolfssl-manual-3-getting-started.html">Previous Chapter</a></p>
</div>
</div>
</div>
<div id="id15" style="height: 27px; left: 59px; position: absolute; top: 190px; width: 196px; z-index: 1; " class="style_SkipStroke shape-with-text">
<div class="text-content graphic_textbox_layout_style_default_External_196_27" style="padding: 0px; ">
<div class="graphic_textbox_layout_style_default">
<p style="padding-bottom: 0pt; padding-top: 0pt; " class="paragraph_style_18"><a class="class12" title="https://www.wolfssl.com/documentation/wolfSSL-Manual.pdf" href="https://www.wolfssl.com/documentation/wolfSSL-Manual.pdf">Download wolfSSL Manual (PDF)</a></p>
</div>
</div>
</div>
<div style="height: 22px; width: 22px;  height: 22px; left: 33px; position: absolute; top: 191px; width: 22px; z-index: 1; " class="tinyText style_SkipStroke_2">
<img src="Docs-wolfssl-manual-4-features_files/PDF.png" alt="" style="border: none; height: 22px; width: 22px; "/>
</div>
<div class="com-apple-iweb-widget-HTMLRegion" id="widget0" style="height: 247px; left: 130px; opacity: 1.00; position: absolute; top: 3545px; width: 511px; z-index: 1; ">
<script type="text/javascript">//<![CDATA[
var widget0_htmlMarkupURL="https://www.wolfssl.com/Docs-wolfssl-manual-4-features_files/widget0_markup.html";
//]]></script>
<div id="widget0-htmlRegion" class="html_region_widget"></div>
</div>
<script type="text/javascript">//<![CDATA[
new Paste('widget0','Scripts/Widgets/HTMLRegion','Scripts/Widgets/SharedResources','.',{"emptyLook":false});
//]]></script>
<div class="com-apple-iweb-widget-HTMLRegion" id="widget1" style="height: 155px; left: 177px; opacity: 1.00; position: absolute; top: 3835px; width: 418px; z-index: 1; ">
<script type="text/javascript">//<![CDATA[
var widget1_htmlMarkupURL="https://www.wolfssl.com/Docs-wolfssl-manual-4-features_files/widget1_markup.html";
//]]></script>
<div id="widget1-htmlRegion" class="html_region_widget"></div>
</div>
<script type="text/javascript">//<![CDATA[
new Paste('widget1','Scripts/Widgets/HTMLRegion','Scripts/Widgets/SharedResources','.',{"emptyLook":false});
//]]></script>
<div class="com-apple-iweb-widget-HTMLRegion" id="widget2" style="height: 1969px; left: 95px; opacity: 1.00; position: absolute; top: 4611px; width: 578px; z-index: 1; ">
<script type="text/javascript">//<![CDATA[
var widget2_htmlMarkupURL="https://www.wolfssl.com/Docs-wolfssl-manual-4-features_files/widget2_markup.html";
//]]></script>
<div id="widget2-htmlRegion" class="html_region_widget"></div>
</div>
<script type="text/javascript">//<![CDATA[
new Paste('widget2','Scripts/Widgets/HTMLRegion','Scripts/Widgets/SharedResources','.',{"emptyLook":false});
//]]></script>
<div id="id16" style="height: 25px; left: 323px; position: absolute; top: 224px; width: 125px; z-index: 1; " class="style_SkipStroke shape-with-text">
<div class="text-content graphic_textbox_layout_style_default_External_125_25" style="padding: 0px; ">
<div class="graphic_textbox_layout_style_default">
<p style="padding-bottom: 0pt; padding-top: 0pt; " class="paragraph_style_19"><a title="Docs-wolfssl-manual-toc.html" href="Docs-wolfssl-manual-toc.html">Table of Contents</a></p>
</div>
</div>
</div>
<div id="id17" style="height: 34px; left: 35px; position: absolute; top: 3777px; width: 701px; z-index: 1; " class="style_SkipStroke shape-with-text">
<div class="text-content graphic_textbox_layout_style_default_External_701_34" style="padding: 0px; ">
<div class="graphic_textbox_layout_style_default">
<p style="padding-bottom: 0pt; padding-top: 0pt; " class="paragraph_style_20">(Table 2: Relative Bit and Key Strengths)</p>
</div>
</div>
</div>
<div id="id18" style="height: 7710px; left: 35px; position: absolute; top: 6592px; width: 701px; z-index: 1; " class="style_SkipStroke shape-with-text">
<div class="text-content graphic_textbox_layout_style_default_External_701_7710" style="padding: 0px; ">
<div class="graphic_textbox_layout_style_default">
<p style="padding-top: 0pt; " class="paragraph_style_21">(Table 4: wolfSSL Cipher Suites)<br/></p>
<p class="paragraph_style_21"><br/></p>
<p class="paragraph_style_21"><br/></p>
<p class="paragraph_style_22">4.3.3 AEAD Suites<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">wolfSSL supports AEAD suites, including AES-GCM, AES-CCM, and CHACHA-POLY1305. The big difference between these AEAD suites and others is that they authenticate the encrypted data. This helps with mitigating man in the middle attacks that result in having data tampered with. AEAD suites use a combination of a block cipher (or more recently also a stream cipher) algorithm combined with a tag produced by a keyed hash algorithm. Combining these two algorithms is handled by the wolfSSL encrypt and decrypt process which makes it easier for users. All that is needed for using a specific AEAD suite is simply enabling the algorithms that are used in a supported suite.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_2">4.3.4 Block and Stream Ciphers<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">wolfSSL supports the <span class="style">AES</span>, <span class="style">DES</span>, <span class="style">3DES</span>, and <span class="style">Camellia</span> block ciphers and the <span class="style">RC4</span>, <span class="style">RABBIT</span>, <span class="style">HC-128</span> and <span class="style">CHACHA20</span> stream ciphers. AES, DES, 3DES, RC4 and RABBIT are enabled by default.  Camellia, HC-128, and ChaCha20 can be enabled when building wolfSSL (with the --enable-hc128, --enable-camellia, and --enable-chacha build options, respectively). The default mode of AES is CBC mode.  To enable GCM or CCM mode with AES, use the --enable-aesgcm and --enable-aesccm build options.  Please see the examples for usage and the wolfCrypt Usage Reference (<a title="Docs-wolfssl-manual-10-wolfcrypt-usage-reference.html" href="Docs-wolfssl-manual-10-wolfcrypt-usage-reference.html">Chapter 10</a>) for specific usage information.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">SSL uses RC4 as the default stream cipher. It's a good one, though it's getting a little old. wolfSSL has added two ciphers from the eStream project into the code base, RABBIT and HC-128. RABBIT is nearly twice as fast as RC4 and HC-128 is about 5 times as fast! So if you've ever decided not to use SSL because of speed concerns, using wolfSSL's stream ciphers should lessen or eliminate that performance doubt. Recently wolfSSL also added ChaCha20. While RC4 performs about .11 times faster then ChaCha, RC4 is generally considered less secure than ChaCha. ChaCha can put up very nice times of it’s own with added security as a tradeoff.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">To see a comparison of cipher performance, visit the <a title="benchmarks-wolfssl.html" href="benchmarks-wolfssl.html">wolfSSL Benchmark web page</a>.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_2">4.3.4.1 What’s the Difference?<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_23">Have you ever wondered what the difference was between a block cipher and a stream cipher?<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">A block cipher has to be encrypted in chunks that are the block size for the cipher. For example, AES has block size of 16 bytes. So if you're encrypting a bunch of small, 2 or 3 byte chunks back and forth, over 80% of the data is useless padding, decreasing the speed of the encryption/decryption process and needlessly wasting network bandwidth to boot. Basically block ciphers are designed for large chunks of data, have block sizes requiring padding, and use a fixed, unvarying transformation.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">Stream ciphers work well for large or small chunks of data. They are suitable for smaller data sizes because no block size is required. If speed is a concern, stream ciphers are your answer, because they use a simpler transformation that typically involves an xor'd keystream. So if you need to stream media, encrypt various data sizes including small ones, or have a need for a fast cipher then stream ciphers are your best bet.<br/></p>
<p class="paragraph_style_2"><br/></p>
<p class="paragraph_style_2"><br/></p>
<p class="paragraph_style_2">4.3.5 Hashing Functions<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">wolfSSL supports several different hashing functions, including <span class="style">MD2</span>, <span class="style">MD4</span>, <span class="style">MD5</span>, <span class="style">SHA-1</span>, <span class="style">SHA-2</span> (SHA-224, SHA-256, SHA-384, SHA-512), BLAKE2b, Poly1305, and <span class="style">RIPEMD-160</span>.  Detailed usage of these functions can be found in the wolfCrypt Usage Reference, <a title="Docs-wolfssl-manual-10-wolfcrypt-usage-reference.html" href="Docs-wolfssl-manual-10-wolfcrypt-usage-reference.html">Section 10.1</a>.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_2">4.3.6 Public Key Options<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">wolfSSL supports the <span class="style">RSA</span>, <span class="style">ECC</span>, <span class="style">DSA</span>/<span class="style">DSS</span>, <span class="style">DH</span>, and <span class="style">NTRU</span> public key options, with support for <span class="style">EDH</span> (Ephemeral Diffie-Hellman) on the wolfSSL server.  Detailed usage of these functions can be found in the <a title="Docs-wolfssl-manual-10-wolfcrypt-usage-reference.html" href="Docs-wolfssl-manual-10-wolfcrypt-usage-reference.html">wolfCrypt Usage Reference</a>, section 10.5.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">wolfSSL has support for four cipher suites utilizing NTRU:<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_9">TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA<br/></p>
<p class="paragraph_style_9">TLS_NTRU_RSA_WITH_RC4_128_SHA<br/></p>
<p class="paragraph_style_9">TLS_NTRU_RSA_WITH_AES_128_CBC_SHA<br/></p>
<p class="paragraph_style_9">TLS_NTRU_RSA_WITH_AES_256_CBC_SHA<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">The strongest one, AES-256, is the default. If wolfSSL is enabled with NTRU and the NTRU package is available, these cipher suites are built into the wolfSSL library. A wolfSSL client will have these cipher suites available without any interaction needed by the user. On the other hand, a wolfSSL server application will need to load an NTRU private key and NTRU x509 certificate in order for those cipher suites to be available for use. <br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">The example servers, echoserver and server, both use the define HAVE_NTRU (which is turned on by enabling NTRU) to specify whether or not to load NTRU keys and certificates. The wolfSSL package comes with test keys and certificates in the /certs directory. ntru-cert.pem is the certificate and ntru-key.raw is the private key blob. <br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">The wolfSSL NTRU cipher suites are given the highest preference order when the protocol picks a suite. Their exact preference order is the reverse of the above listed suites, i.e., AES-256 will be picked first and 3DES last before moving onto the “standard” cipher suites. Basically, if a user builds NTRU into wolfSSL and both sides of the connection support NTRU then an NTRU cipher suite will be picked unless a user on one side has explicitly excluded them by stating to only use different cipher suites. Copyright 2015 wolfSSL Inc. All rights reserved. 54 Using NTRU over RSA can provide a 20 - 200X speed improvement. The improvement increases as the size of keys increases, meaning a much larger speed benefit when using large keys (8192-bit) versus smaller keys (1024-bit).<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_2">4.3.7 ECC Support<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">wolfSSL has support for Elliptic Curve Cryptography (ECC) including but not limited to: ECDH-ECDSA, ECDHE-ECDSA, ECDH-RSA, ECDHE-PSK and ECDHE-RSA.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">wolfSSL’s ECC implementation can be found in the <span class="style">&lt;wolfssl_root&gt;/wolfssl/wolfcrypt/ecc.h</span> header file and the <span class="style">&lt;wolfssl_root&gt;/wolfcrypt/src/ecc.c</span> source file. <br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">Supported cipher suites are shown in the table above.  ECC is disabled by default on non x86_64 builds, but can be turned on when building wolfSSL with the HAVE_ECC define or by using the autoconf system:<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_7">./configure --enable-ecc<br/></p>
<p class="paragraph_style_7">make<br/></p>
<p class="paragraph_style_7">make check<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">When “make check” runs, note the numerous cipher suites that wolfSSL checks (if make check doesn’t produce a list of cipher suites run ./testsuite/testsuite.test on its own).  Any of these cipher suites can be tested individually, e.g., to try ECDH-ECDSA with AES256-SHA, the example wolfSSL server can be started like this:<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_7">./examples/server/server -d -l ECDHE-ECDSA-AES256-SHA -c ./certs/server-ecc.pem -k ./certs/ecc-key.pem<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">(-d) disables client cert check while (-l) specifies the cipher suite list. (-c) is the certificate to use and (-k) is the corresponding private key to use.  To have the client connect try:<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_7">./examples/client/client -A ./certs/server-ecc.pem<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">where (-A) is the CA certificate to use to verify the server.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_2">4.3.8 PKCS Support<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">PKCS (Public Key Cryptography Standards) refers to a group of standards created and published by RSA Security, Inc. wolfSSL has support for <span class="style">PKCS #5</span>, <span class="style">PKCS#7</span>, <span class="style">PKCS #8</span>, and PBKD from <span class="style">PKCS #12</span>.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_2">4.3.8.1 PKCS #5, PBKDF1, PBKDF2, PKCS #12<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">PKCS #5 is a password based key derivation method which combines a password, a salt, and an iteration count to generate a password-based key.  wolfSSL supports both PBKDF1 and PBKDF2 key derivation functions. A key derivation function produces a derived key from a base key and other parameters (such as the salt and iteration count as explained above). PBKDF1 applies a hash function (MD5, SHA1, etc) to derive keys, where the derived key length is bounded by the length of the hash function output. With PBKDF2, a psudorandom function is applied (such as HMAC-SHA-1) to derive the keys. In the case of PBKDF2, the derived key length is unbounded.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">wolfSSL also supports the PBKDF function from PKCS #12 in addition to PBKDF1 and PBKDF2. The function prototypes look like this:<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_7">int PBKDF2(byte* output, const byte* passwd, int pLen, <br/></p>
<p class="paragraph_style_7">           const byte* salt,int sLen, int iterations, <br/></p>
<p class="paragraph_style_7">           int kLen, int hashType);<br/></p>
<p class="paragraph_style_7"><br/></p>
<p class="paragraph_style_7">int PKCS12_PBKDF(byte* output, const byte* passwd, int pLen, <br/></p>
<p class="paragraph_style_7">                 const byte* salt, int sLen, int iterations, <br/></p>
<p class="paragraph_style_7">                 int kLen, int hashType, int purpose);<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><span class="style">output</span> contains the derived key, <span class="style">passwd</span> holds the user password of length <span class="style">pLen</span>, <span class="style">salt</span> holds the salt input of length <span class="style">sLen</span>, <span class="style">iterations</span> is the number of iterations to perform, <span class="style">kLen</span> is the desired derived key length, and <span class="style">hashType</span> is the hash to use (which can be MD5, SHA1, or SHA2).<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">If you are using ./configure to build wolfssl, the way enable this functionality is to use the option --enable-pwdbased <br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">A full example can be found in wolfcrypt/src/test.c. More information can be found on PKCS #5, PBKDF1, and PBKDF2 from the following specifications:<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">PKCS#5, PBKDF1, PBKDF2: <a title="http://tools.ietf.org/html/rfc2898" href="http://tools.ietf.org/html/rfc2898">http://tools.ietf.org/html/rfc2898</a><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_2">4.3.8.2 PKCS #8<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">PKCS #8 is designed as the Private-Key Information Syntax Standard, which is used to store private key information - including a private key for some public-key algorithm and set of attributes.  <br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">The PKCS #8 standard has two versions which describe the syntax to store both encrypted private keys and non-encrypted keys. wolfSSL supports both non-encrypted and encrypted PKCS #8. Supported formats include PKCS #5 version 1 - version 2, and PKCS#12. Types of encryption available include DES, 3DES, RC4, and AES.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">PKCS#8:  <a title="http://tools.ietf.org/html/rfc5208" href="http://tools.ietf.org/html/rfc5208">http://tools.ietf.org/html/rfc5208</a><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_2">4.3.9 Forcing the Use of a Specific Cipher<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">By default, wolfSSL will pick the “best” (highest security) cipher suite that both sides of the connection can support.  To force a specific cipher, such as 128 bit AES, add something similar to:<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_7">wolfSSL_CTX_set_cipher_list(ctx, “AES128-SHA”);<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">after the call to wolfSSL_CTX_new();  so that you have:<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_7">ctx = wolfSSL_CTX_new(method);<br/></p>
<p class="paragraph_style_7">wolfSSL_CTX_set_cipher_list(ctx, “AES128-SHA”);<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_2">4.3.10 Quantum-Safe Handshake Ciphersuite<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">wolfSSL has support for the cipher suite utilizing post quantum handshake cipher suite such as with NTRU:<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_9">            TLS_QSH<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">If wolfSSL is enabled with NTRU and the NTRU package is available, the TLS_QSH cipher suite is built into the wolfSSL library. A wolfSSL client and server will have this cipher suite available without any interaction needed by the user.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">The wolfSSL quantum safe handshake cipher suite is given the highest preference order when the protocol picks a suite. Basically, if a user builds NTRU into wolfSSL and both sides of the connection support NTRU then an NTRU cipher suite will be picked unless a user on one side has explicitly excluded them by stating to only use different cipher suites.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">Users can adjust what crypto algorithms and if the client sends across public keys by using the function examples<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_7">wolfSSL_UseClientQSHKeys(ssl, 1);<br/></p>
<p class="paragraph_style_7"> <br/></p>
<p class="paragraph_style_7">wolfSSL_UseSupportedQSH(ssl, WOLFSSL_NTRU_EESS439);<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">To test if a QSH connection was established after a client has connected the following function example can be used.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_7">wolfSSL_isQSH(ssl);<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_6">4.4 Hardware Accelerated Crypto<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">wolfSSL is able to take advantage of several hardware accelerated (or “assisted”) crypto functionalities in various processors and chips.  The following sections explain which technologies wolfSSL supports out-of-the-box.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_2">4.4.1 Intel AES-NI<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">AES is a key encryption standard used by governments worldwide, which wolfSSL has always supported. Intel has released a new set of instructions that is a faster way to implement AES. wolfSSL is the first SSL library to fully support the new instruction set for production environments.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">Essentially, Intel has added AES instructions at the chip level that perform the computationally-intensive parts of the AES algorithm, boosting performance.  For a list of Intel’s chips that currently have support for AES-NI, you can look here:<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><a title="http://ark.intel.com/search/advanced/?s=t&amp;AESTech=true" href="http://ark.intel.com/search/advanced/?s=t&amp;AESTech=true">http://ark.intel.com/search/advanced/?s=t&amp;AESTech=true</a><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">We have added the functionality to wolfSSL to allow it to call  the instructions directly from the chip, instead of running the algorithm in software. This means that when you’re running wolfSSL on a chipset that supports AES-NI, you can run your AES crypto 5-10 times faster!<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">If you are running on an AES-NI supported chipset, enable AES-NI with the <span class="style">--enable-aesni </span>build option.  To build wolfSSL with AES-NI, GCC 4.4.3 or later is required to make use of the assembly code.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">References and further reading on AES-NI, ordered from general to specific, are listed below.  For information about performance gains with AES-NI, please see the third link to the Intel Software Network page.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">AES (Wikipedia):  <a title="http://en.wikipedia.org/wiki/Advanced_Encryption_Standard" href="http://en.wikipedia.org/wiki/Advanced_Encryption_Standard">http://en.wikipedia.org/wiki/Advanced_Encryption_Standard</a><br/></p>
<p class="paragraph_style_1">AES-NI (Wikipedia):  <a title="http://en.wikipedia.org/wiki/AES_instruction_set" href="http://en.wikipedia.org/wiki/AES_instruction_set">http://en.wikipedia.org/wiki/AES_instruction_set</a><br/></p>
<p class="paragraph_style_1">AES-NI (Intel Software Network page):  <a title="http://software.intel.com/en-us/articles/intel-advanced-encryption-standard-instructions-aes-ni/" href="http://software.intel.com/en-us/articles/intel-advanced-encryption-standard-instructions-aes-ni/">http://software.intel.com/en-us/articles/intel-advanced-encryption-standard-instructions-aes-ni/</a><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_2">4.4.2 STM32F2<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">wolfSSL is able to use the STM32F2 hardware-based cryptography and random number generator through the STM32F2 Standard Peripheral Library. <br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">For necessary defines, see the <span class="style">WOLFSSL_STM32F2</span> define in settings.h.  The WOLFSSL_STM32F2 define enables STM32F2 hardware crypto and RNG support by default.  The defines for enabling these individually are <span class="style">STM32F2_CRYPTO</span> (for hardware crypto support) and <span class="style">STM32F2_RNG</span> (for hardware RNG support).<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">Documentation for the STM32F2 Standard Peripheral Library can be found in the following document:<br/></p>
<p class="paragraph_style_1"><a title="http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/USER_MANUAL/DM00023896.pdf" href="http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/USER_MANUAL/DM00023896.pdf">http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/USER_MANUAL/DM00023896.pdf</a><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_2">4.4.3 Cavium NITROX<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">wolfSSL has support for Cavium NITROX (<a title="http://www.cavium.com/processor_security.html" href="http://www.cavium.com/processor_security.html">http://www.cavium.com/processor_security.html</a>).  To enable Cavium NITROX support when building wolfSSL use the following configure option:<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_7">./configure --with-cavium=/home/user/cavium/software<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">Where the “<span class="style">--with-cavium=</span>” option is pointing to your licensed cavium/software directory.  Since Cavium doesn't build a library wolfSSL pulls in the cavium_common.o file which gives a libtool warning about the portability of this.  Also, if you're using the github source tree you'll need to remove the -Wredundant-decls warning from the generated Makefile because the cavium headers don't conform to this warning.  <br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">Currently wolfSSL supports Cavium RNG, AES, 3DES, RC4, HMAC, and RSA directly at the crypto layer.  Support at the SSL level is partial and currently just does AES, 3DES, and RC4.  RSA and HMAC are slower until the Cavium calls can be utilized in non-blocking mode.  The example client turns on cavium support as does the crypto test and benchmark.  Please see the <span class="style">HAVE_CAVIUM</span> define.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_6">4.5 SSL Inspection (Sniffer)<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">Beginning with the wolfSSL 1.5.0 release, wolfSSL has included a build option allowing it to be built with SSL Sniffer (SSL Inspection) functionality. This means that you can collect SSL traffic packets and with the correct key file, are able to decrypt them as well. The ability to “inspect” SSL traffic can be useful for several reasons, some of which include:<br/></p>
<p class="paragraph_style_1"><br/></p>
<ol>
<li style="line-height: 15px; padding-left: 10px; text-indent: -10px; " class="full-width">
<p style="text-indent: -10px; " class="paragraph_style_24"><span style="font-size: 12px; " class="Bullet">•</span><span style="width: 6px; " class="inline-block"></span>Analyzing Network Problems<br/></p>
</li>
<li style="line-height: 15px; padding-left: 10px; text-indent: -10px; " class="full-width">
<p style="text-indent: -10px; " class="paragraph_style_24"><span style="font-size: 12px; " class="Bullet">•</span><span style="width: 6px; " class="inline-block"></span>Detecting network misuse by internal and external users<br/></p>
</li>
<li style="line-height: 15px; padding-left: 10px; text-indent: -10px; " class="full-width">
<p style="text-indent: -10px; " class="paragraph_style_24"><span style="font-size: 12px; " class="Bullet">•</span><span style="width: 6px; " class="inline-block"></span>Monitoring network usage and data in motion<br/></p>
</li>
<li style="line-height: 15px; padding-left: 10px; text-indent: -10px; " class="full-width">
<p style="text-indent: -10px; " class="paragraph_style_24"><span style="font-size: 12px; " class="Bullet">•</span><span style="width: 6px; " class="inline-block"></span>Debugging client/server communications<br/></p>
</li>
</ol>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">To enable sniffer support, build wolfSSL with the <span class="style">--enable-sniffer</span> option on *nix or use the <span class="style">vcproj</span> files on Windows. You will need to have <span class="style">pcap</span> installed on *nix or <span class="style">WinPcap</span> on Windows. The main sniffer functions which can be found in sniffer.h are listed below with a short description of each:<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><span class="style">ssl_SetPrivateKey</span> - Sets the private key for a specific server and port.<br/></p>
<p class="paragraph_style_1"><span class="style">ssl_SetNamedPrivateKey</span> - Sets the private key for a specific server, port and domain name.<br/></p>
<p class="paragraph_style_1"><span class="style">ssl_DecodePacket</span> - Passes in a TCP/IP packet for decoding.<br/></p>
<p class="paragraph_style_1"><span class="style">ssl_Trace</span> - Enables / Disables debug tracing to the traceFile.<br/></p>
<p class="paragraph_style_1"><span class="style">ssl_InitSniffer</span> - Initialize the overall sniffer.<br/></p>
<p class="paragraph_style_1"><span class="style">ssl_FreeSniffer</span> - Free the overall sniffer.<br/></p>
<p class="paragraph_style_1"><span class="style">ssl_EnableRecovery</span> - Enables option to attempt to pick up decoding of SSL traffic in the case of lost packets.<br/></p>
<p class="paragraph_style_1"><span class="style">ssl_GetSessionStats</span> - Obtains memory usage for the sniffer sessions.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">To look at wolfSSL's sniffer support and see a complete example, please see the &quot;<span class="style">snifftest</span>&quot; app in the &quot;sslSniffer/sslSnifferTest&quot; folder from the wolfSSL download.  <br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">Keep in mind that because the encryption keys are setup in the SSL Handshake, the handshake needs to be decoded by the sniffer in order for future application data to be decoded. For example, if you are using &quot;snifftest&quot; with the wolfSSL example echoserver and echoclient, the snifftest application must be started before the handshake begins between the server and client.  <br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">The sniffer can only decode streams encryped with the following algorthims: AES-CBC, DES3-CBC, ARC4, HC-128, RABBIT, Camellia-CBC, and IDEA. If ECDHE or DHE key agreement is used the stream cannot be sniffed; only RSA key-exchange is supported.<br/></p>
<p class="paragraph_style_6"><br/></p>
<p class="paragraph_style_6"><br/></p>
<p class="paragraph_style_6">4.6 Compression<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">wolfSSL supports data compression with the <span class="style">zlib</span> library. The ./configure build system detects the presence of this library, but if you're building in some other way define the constant <span class="style">HAVE_LIBZ</span> and include the path to zlib.h for your includes. <br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">Compression is off by default for a given cipher. To turn it on, use the function wolfSSL_set_compression() before SSL connecting or accepting. Both the client and server must have compression turned on in order for compression to be used.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">Keep in mind that while compressing data before sending decreases the actual size of the messages being sent and received, the amount of data saved by compression usually takes longer in time to analyze than it does to send it raw on all but the slowest of networks.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_6">4.7 Pre-Shared Keys<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">wolfSSL has support for these ciphers with static pre shared keys:<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_9">TLS_PSK_WITH_AES_256_CBC_SHA<br/></p>
<p class="paragraph_style_9">TLS_PSK_WITH_AES_128_CBC_SHA256<br/></p>
<p class="paragraph_style_9">TLS_PSK_WITH_AES_256_CBC_SHA384<br/></p>
<p class="paragraph_style_9">TLS_PSK_WITH_AES_128_CBC_SHA<br/></p>
<p class="paragraph_style_9">TLS_PSK_WITH_NULL_SHA256<br/></p>
<p class="paragraph_style_9">TLS_PSK_WITH_NULL_SHA384<br/></p>
<p class="paragraph_style_9">TLS_PSK_WITH_NULL_SHA<br/></p>
<p class="paragraph_style_9">TLS_PSK_WITH_AES_128_GCM_SHA256<br/></p>
<p class="paragraph_style_9">TLS_PSK_WITH_AES_256_GCM_SHA384<br/></p>
<p class="paragraph_style_9">TLS_PSK_WITH_AES_128_CCM<br/></p>
<p class="paragraph_style_9">TLS_PSK_WITH_AES_256_CCM<br/></p>
<p class="paragraph_style_9">TLS_PSK_WITH_AES_128_CCM_8<br/></p>
<p class="paragraph_style_9">TLS_PSK_WITH_AES_256_CCM_8<br/></p>
<p class="paragraph_style_9">TLS_PSK_WITH_CHACHA20_POLY1305<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">These suites are built into wolfSSL with <span class="style">WOLFSSL_STATIC_PSK</span> on, all PSK suites can be turned off at build time with the constant <span class="style">NO_PSK</span>. To only use these ciphers at runtime use the function <span class="style">wolfSSL_CTX_set_cipher_list</span>() with the desired ciphersuite.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">wolfSSL has support for ephemeral key PSK suites:<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_9">ECDHE-PSK-AES128-CBC-SHA256<br/></p>
<p class="paragraph_style_9">ECDHE-PSK-NULL-SHA256<br/></p>
<p class="paragraph_style_9">ECDHE-PSK-CHACHA20-POLY1305<br/></p>
<p class="paragraph_style_9">DHE-PSK-CHACHA20-POLY1305<br/></p>
<p class="paragraph_style_9">DHE-PSK-AES256-GCM-SHA384<br/></p>
<p class="paragraph_style_9">DHE-PSK-AES128-GCM-SHA256<br/></p>
<p class="paragraph_style_9">DHE-PSK-AES256-CBC-SHA384<br/></p>
<p class="paragraph_style_9">DHE-PSK-AES128-CBC-SHA256<br/></p>
<p class="paragraph_style_9">DHE-PSK-AES128-CBC-SHA256<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">On the client, use the function <span class="style">wolfSSL_CTX_set_psk_client_callback</span>() to setup the callback. The client example in &lt;wolfSSL_Home&gt;/examples/client/client.c gives example usage for setting up the client identity and key, though the actual callback is implemented in wolfssl/test.h.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">On the server side two additional calls are required:<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_9">wolfSSL_CTX_set_psk_server_callback()<br/></p>
<p class="paragraph_style_9">wolfSSL_CTX_use_psk_identity_hint()<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">The server stores its identity hint to help the client with the 2nd call, in our server example that's &quot;wolfssl server&quot;.  An example server psk callback can also be found in my_psk_server_cb() in wolfssl/test.h.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">wolfSSL supports identities and hints up to 128 octets and pre shared keys up to 64 octets.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_6">4.8 Client Authentication<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">Client authentication is a feature which enables the server to authenticate clients by requesting that the clients send a certificate to the server for authentication when they connect. Client authentication requires an X.509 client certificate from a CA (or self-signed if generated by you or someone other than a CA).<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">By default, wolfSSL validates all certificates that it receives - this includes both client and server. To set up client authentication, the server must load the list of trusted CA certificates to be used to verify the client certificate against:<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_7">wolfSSL_CTX_load_verify_locations(ctx, caCert, 0);<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">To turn on client verification and control its behavior, the wolfSSL_CTX_set_verify() function is used.  In the following example, <span class="style">SSL_VERIFY_PEER</span> turns on a certificate request from the server to the client.  <span class="style">SSL_VERIFY_FAIL_IF_NO_PEER_CERT</span> instructs the server to fail if the client does not present a certificate to validate on the server side.  Other options to wolfSSL_CTX_set_verify() include <span class="style">SSL_VERIFY_NONE</span> and <span class="style">SSL_VERIFY_CLIENT_ONCE</span>.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_7">wolfSSL_CTX_set_verify(ctx,SSL_VERIFY_PEER | ((usePskPlus)? <br/></p>
<p class="paragraph_style_7">                       SSL_VERIFY_FAIL_EXCEPT_PSK :<br/></p>
<p class="paragraph_style_7">                       SSL_VERIFY_FAIL_IF_NO_PEER_CERT),0);<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">An example of client authentication can be found in the example server (server.c) included in the wolfSSL download (/examples/server/server.c).<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_25">4.9 Server Name Indication<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">SNI is useful when a server hosts multiple ‘virtual’ servers at a single underlying network address. It may be desirable for clients to provide the name of the server which it is contacting. To enable SNI with wolfSSL you can simply do:<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_7">./configure --enable-sni<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">Using SNI on the client side requires an additional function call, which should be one of the following functions:<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_7">wolfSSL_CTX_UseSNI()<br/></p>
<p class="paragraph_style_7">wolfSSL_UseSNI()<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">wolfSSL_CTX_UseSNI() is most recommended when the client contacts the same server multiple times. Setting the SNI extension at the context level will enable the SNI usage in all SSL objects created from that same context from the moment of the call forward. <br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">wolfSSL_UseSNI() will enable SNI usage for one SSL object only, so it is recommended to use this function when the server name changes between sessions.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">On the server side one of the same function calls is required. Since the wolfSSL server doesn't host multiple 'virtual' servers, the SNI usage is useful when the termination of the connection is desired in the case of SNI mismatch. In this scenario, wolfSSL_CTX_UseSNI() will be more efficient, as the server will set it only once per context creating all subsequent SSL objects with SNI from that same context.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_6">4.10 Handshake Modifications<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_2">4.10.1 Grouping Handshake Messages<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">wolfSSL has the ability to group handshake messages if the user desires.  This can be done at the context level with:<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_7">wolfSSL_CTX_set_group_messages(ctx);<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">or at the SSL object level with:<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_7">wolfSSL_set_group_messages(ssl);<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_25">4.11 Truncated HMAC<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">Currently defined TLS cipher suites use the HMAC to authenticate record-layer communications. In TLS, the entire output of the hash function is used as the MAC tag. However, it may be desirable in constrained environments to save bandwidth by truncating the output of the hash function to 80 bits when forming MAC tags. To enable the usage of Truncated HMAC at wolfSSL you can simply do:<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_7">./configure --enable-truncatedhmac<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">Using Truncated HMAC on the client side requires an additional function call, which should be one of the following functions:<br/></p>
<p class="paragraph_style_7"><br/></p>
<p class="paragraph_style_7">wolfSSL_CTX_UseTruncatedHMAC();<br/></p>
<p class="paragraph_style_7">wolfSSL_UseTruncatedHMAC();<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><span class="style">wolfSSL_CTX_UseTruncatedHMAC</span>() is most recommended when the client would like to enable Truncated HMAC for all sessions. Setting the Truncated HMAC extension at context level will enable it in all SSL objects created from that same context from the moment of the call forward. <br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><span class="style">wolfSSL_UseTruncatedHMAC</span>() will enable it for one SSL object only, so it's recommended to use this function when there is no need for Truncated HMAC on all sessions.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">On the server side no call is required. The server will automatically attend to the client's request for Truncated HMAC.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">All TLS extensions can also be enabled with:<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_7">./configure --enable-tlsx<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_25">4.12 User Crypto Module<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">User Crypto Module allows for a user to plug in custom crypto that they want used during supported operations (Currently RSA operations are supported). An example of a module is located in the directory root_wolfssl/wolfcrypt/user-crypto/ using IPP libraries. Examples of the configure option when building wolfSSL to use a crypto module is as follows :<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_7">./configure --with-user-crypto<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">or<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_7">./configure --with-user-crypto=/dir/to<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">When creating a user crypto module that performs RSA operations, it is mandatory that there is a header file for RSA called user_rsa.h. For all user crypto operations it is mandatory that the users library be called libusercrypto. These are the names that wolfSSL autoconf tools will be looking for when linking and using a user crypto module. In the example provided with wolfSSL, the header file user_rsa.h can be found in the directory wolfcrypt/user-crypto/include/ and the library once created is located in the directory wolfcrypt/user-crypto/lib/ . For a list of required API look at the header file provided.<br/><br/>To build the example, after having installed IPP libraries, the following commands from the root wolfSSL directory should be ran.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_7">cd wolfcrypt/user-crypto/<br/></p>
<p class="paragraph_style_7">./autogen.sh<br/></p>
<p class="paragraph_style_7">./configure<br/></p>
<p class="paragraph_style_7">make<br/></p>
<p class="paragraph_style_7">sudo make install<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">The included example in wolfSSL requires the use of IPP, which will need to be installed before the project can be built. Though even if not having IPP libraries to build the example it is intended to provide users with an example of file name choice and API interface. Once having made and installed both the library libusercrypto and header files, making wolfSSL use the crypto module does not require any extra steps. Simply using the configure flag --with-user-crypto will map all function calls from the typical wolfSSL crypto to the user crypto module.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p class="paragraph_style_1">Memory allocations, if using wolfSSL’s XMALLOC, should be tagged with DYNAMIC_TYPE_USER_CRYPTO. Allowing for analyzing memory allocations used by the module.<br/></p>
<p class="paragraph_style_1"><br/></p>
<p style="padding-bottom: 0pt; " class="paragraph_style_1">User crypto modules <span class="style">can not</span> be used in conjunction with the wolfSSL configure options fast-rsa and/or fips. Fips requires that specific, certified code be used and fast-rsa makes use of the example user crypto module to perform RSA operations.</p>
</div>
</div>
</div>
<div id="id19" style="height: 27px; left: 634px; position: absolute; top: 224px; width: 102px; z-index: 1; " class="style_SkipStroke shape-with-text">
<div class="text-content graphic_textbox_layout_style_default_External_102_27" style="padding: 0px; ">
<div class="graphic_textbox_layout_style_default">
<p style="padding-bottom: 0pt; padding-top: 0pt; " class="paragraph_style_26"><a class="class13" title="Docs-wolfssl-manual-5-portability.html" href="Docs-wolfssl-manual-5-portability.html">Next Chapter</a></p>
</div>
</div>
</div>
<div style="height: 16px; width: 20px;  height: 16px; left: 706px; position: absolute; top: 51px; width: 20px; z-index: 1; " class="tinyText">
<div style="position: relative; width: 20px; ">
<img src="Docs-wolfssl-manual-4-features_files/shapeimage_11.png" alt="" style="height: 16px; left: 0px; position: absolute; top: 0px; width: 20px; "/>
</div>
</div>
<div style="height: 19px; width: 19px;  height: 19px; left: 707px; position: absolute; top: 25px; width: 19px; z-index: 1; " class="tinyText style_SkipStroke_2">
<img src="Docs-wolfssl-manual-4-features_files/United%20Kingdom(Great%20Britain).png" alt="" style="border: none; height: 19px; width: 19px; "/>
</div>
<div id="id20" style="height: 23px; left: 328px; position: absolute; top: 48px; width: 258px; z-index: 1; " class="style_SkipStroke shape-with-text">
<div class="text-content graphic_textbox_layout_style_default_External_258_23" style="padding: 0px; ">
<div class="graphic_textbox_layout_style_default">
<p style="padding-bottom: 0pt; padding-top: 0pt; " class="paragraph_style_27">Questions? +1 (425) 245-8247</p>
</div>
</div>
</div>
<div style="height: 19px; width: 19px;  height: 19px; left: 685px; position: absolute; top: 25px; width: 19px; z-index: 1; " class="tinyText style_SkipStroke_2">
<a href="http://www.wolfssl.jp/" title="http://www.wolfssl.jp"><img src="Docs-wolfssl-manual-4-features_files/japan.png" alt="" style="border: none; height: 19px; width: 19px; "/></a>
</div>
<div id="id21" style="height: 28px; left: 593px; position: absolute; top: 44px; width: 119px; z-index: 1; " class="style_SkipStroke shape-with-text">
<div class="text-content graphic_textbox_layout_style_default_External_119_28" style="padding: 0px; ">
<div class="graphic_textbox_layout_style_default">
<p style="padding-bottom: 0pt; padding-top: 0pt; " class="paragraph_style_28"><a class="class14" title="https://www.wolfssl.com/forums" href="https://www.wolfssl.com/forums">Support <span class="style_4">Forums</span></a></p>
</div>
</div>
</div>
<div style="height: 121px; width: 155px;  height: 121px; left: 32px; position: absolute; top: 5px; width: 155px; z-index: 1; " class="tinyText style_SkipStroke_2">
<a href="Home.html" title="Home.html"><img src="Docs-wolfssl-manual-4-features_files/wolfssl_logo.png" alt="" style="border: none; height: 121px; width: 156px; "/></a>
</div>
<div style="height: 14302px; line-height: 14302px; " class="spacer"> </div>
</div>
<div style="height: 716px; margin-left: 0px; position: relative; width: 770px; z-index: 15; " id="footer_layer">
<div style="height: 0px; line-height: 0px; " class="bumper"> </div>
<div id="id22" style="height: 27px; left: 634px; position: absolute; top: 649px; width: 102px; z-index: 1; " class="style_SkipStroke shape-with-text">
<div class="text-content graphic_textbox_layout_style_default_External_102_27" style="padding: 0px; ">
<div class="graphic_textbox_layout_style_default">
<p style="padding-bottom: 0pt; padding-top: 0pt; " class="paragraph_style_26"><a class="class15" title="Docs-wolfssl-manual-5-portability.html" href="Docs-wolfssl-manual-5-portability.html">Next Chapter</a></p>
</div>
</div>
</div>
<div id="id23" style="height: 25px; left: 35px; position: absolute; top: 649px; width: 125px; z-index: 1; " class="style_SkipStroke shape-with-text">
<div class="text-content graphic_textbox_layout_style_default_External_125_25" style="padding: 0px; ">
<div class="graphic_textbox_layout_style_default">
<p style="padding-bottom: 0pt; padding-top: 0pt; " class="paragraph_style_29"><a class="class16" title="Docs-wolfssl-manual-3-getting-started.html" href="Docs-wolfssl-manual-3-getting-started.html">Previous Chapter</a></p>
</div>
</div>
</div>
<div id="id24" style="height: 25px; left: 323px; position: absolute; top: 649px; width: 125px; z-index: 1; " class="style_SkipStroke shape-with-text">
<div class="text-content graphic_textbox_layout_style_default_External_125_25" style="padding: 0px; ">
<div class="graphic_textbox_layout_style_default">
<p style="padding-bottom: 0pt; padding-top: 0pt; " class="paragraph_style_19"><a class="class17" title="Docs-wolfssl-manual-toc.html" href="Docs-wolfssl-manual-toc.html">Table of Contents</a></p>
</div>
</div>
</div>
<div id="id25" style="height: 29px; left: 35px; position: absolute; top: 687px; width: 701px; z-index: 1; " class="style_SkipStroke shape-with-text">
<div class="text-content graphic_textbox_layout_style_default_External_701_29" style="padding: 0px; ">
<div class="graphic_textbox_layout_style_default">
<p style="padding-bottom: 0pt; padding-top: 0pt; " class="paragraph_style_30">Copyright 2017 wolfSSL Inc.  All rights reserved.</p>
</div>
</div>
</div>
</div>
</div>
</div>
 </body>

<!-- Mirrored from www.wolfssl.com/wolfSSL/Docs-wolfssl-manual-4-features.html by HTTrack Website Copier/3.x [XR&CO'2014], Tue, 17 Jan 2017 13:29:44 GMT -->
</html>
